from typing import List, Dict
from langchain_core.documents import Document

from library.common import constants
from langchain_community.chat_models import ChatZhipuAI
from library.modelio.zhipu_core import ZhipuEmbeddings
from library.modelio.core import get_prompt
import json

fild_extract_model = ChatZhipuAI(
        temperature=0.3,
        model="glm-4-flash"
    )
guid_model = ChatZhipuAI(
        temperature=0.7,
        model="glm-4-airx"
    )

def get_prompt(is_guid:bool,send_message: str):
    '''
    将沟通历史与检索结果整合成prompt
    '''
    result = []
    if not is_guid:
        result.append(
            {
                "role": "system",
                "content": "你需要在用户对话中提炼出跟赛事创建字段相关的信息。\n"
                           "---\n需要提炼的字段如下：``` {\"address\":{\"name\":\"赛事地点\",\"format\":\"string\",\"describe\":\"赛事举办的详细地址,如:北京市海淀区北太平庄路18号\",\"content\":\"\"},\"siteAddress\":{\"name\":\"场馆名称\",\"format\":\"string\",\"describe\":\"赛事举办的场馆名称,如:北京体育大学体育馆\",\"content\":\"\"},\"sites\":{\"name\":\"比赛场地\",\"format\":\"string\",\"describe\":\"赛事的具体比赛场地,如:A区网球场,B区羽毛球馆\",\"content\":\"\"},\"startTime\":{\"name\":\"比赛开始时间\",\"format\":\"string(date-time)\",\"describe\":\"赛事开始的具体日期和时间,格式为yyyy-MM-dd HH:mm:ss。如果用户使用相对时间表达,如'明天'、'下周二'等,请根据当前日期进行转换。\",\"content\":\"\"},\"endTime\":{\"name\":\"比赛结束时间\",\"format\":\"string(date-time)\",\"describe\":\"赛事结束的具体日期和时间,格式为yyyy-MM-dd HH:mm:ss。如果用户使用相对时间表达,如'后天'、'下周五'等,请根据当前日期进行转换。\",\"content\":\"\"},\"deadline\":{\"name\":\"报名截止时间\",\"format\":\"string(date-time)\",\"describe\":\"赛事报名截止的具体日期和时间,格式为yyyy-MM-dd HH:mm:ss。如果用户使用相对时间表达,如'今晚'、'下周一中午'等,请根据当前日期进行转换。\",\"content\":\"\"},\"organizerList\":[{\"name\":\"主办方\",\"format\":\"string\",\"describe\":\"赛事的主办单位名称,如:中国网球协会,北京体育局\",\"content\":\"\"}]}```请根据用户对话内容，结合字段的describe说明，尽可能准确地提炼出以上赛事字段的信息（时间需要根据当前时间进行灵活转换）。\n"
                           "提炼要求:\n（1）.对于用户没有提及的字段,请保持该字段的content为空。\n（2）.对于可以提炼的字段,请将提炼的内容填写到对应字段的content属性中。（3）.请特别注意startTime、endTime、deadline三个时间字段的格式要求。如果用户使用相对时间表达,如‘明天’、‘下周二’等,请根据当前日期(假设为[今日日期])进行转换,并补充完整的时间信息。 \n---\n最后请以JSON格式返回完整的字段信息。"
            }
        )
    else:
      result.append(
        {
            "role": "system",
            "content": "你是球赞ai助手。需要引导用户进行赛事创建的缺失信息补充。请根据缺失的字段信息，用通俗易懂的语言引导用户进行补充。"
        }
      )
    result.append(
        {
            "role": "user",
            "content":send_message
        }
    )

    return result


def get_response(is_guid:bool,send_message:str):
    """
    @Params: chat_history 沟通历史
    @Params: docs 检索文档
    @Params: query 用户查询
    """
    prompt = get_prompt(is_guid,send_message)
    if is_guid:
        return guid_model.invoke(prompt).content.replace('```','').replace('json','')
    else:
        return json.loads(fild_extract_model.invoke(prompt).content.replace('```','').replace('json',''))


if __name__ == '__main__':
    send_message =  '"[今日日期：2024-06-12]我打算明天在上海体育馆举办足球比赛，我是上海大学。比赛持续两天，报名截止到今晚.然后打算在那个里面的13号馆子"'

    response = get_response(False,send_message)



filed_dict = json.loads("{\"address\":{\"name\":\"赛事地点\",\"format\":\"string\",\"describe\":\"赛事举办的详细地址,如:北京市海淀区北太平庄路18号\",\"content\":\"\"},"
                        "\"siteAddress\":{\"name\":\"场馆名称\",\"format\":\"string\",\"describe\":\"赛事举办的场馆名称,如:北京体育大学体育馆\",\"content\":\"\"},"
                        "\"sites\":{\"name\":\"比赛场地\",\"format\":\"string\",\"describe\":\"赛事的具体比赛场地,如:A区网球场,B区羽毛球馆\",\"content\":\"\"},"
                        "\"startTime\":{\"name\":\"比赛开始时间\",\"format\":\"string(date-time)\",\"describe\":\"赛事开始的具体日期和时间,格式为yyyy-MM-dd HH:mm:ss。如果用户使用相对时间表达,如'明天'、'下周二'等,请根据当前日期进行转换。\",\"content\":\"\"},"
                        "\"endTime\":{\"name\":\"比赛结束时间\",\"format\":\"string(date-time)\",\"describe\":\"赛事结束的具体日期和时间,格式为yyyy-MM-dd HH:mm:ss。如果用户使用相对时间表达,如'后天'、'下周五'等,请根据当前日期进行转换。\",\"content\":\"\"},"
                        "\"deadline\":{\"name\":\"报名截止时间\",\"format\":\"string(date-time)\",\"describe\":\"赛事报名截止的具体日期和时间,格式为yyyy-MM-dd HH:mm:ss。如果用户使用相对时间表达,如'今晚'、'下周一中午'等,请根据当前日期进行转换。\",\"content\":\"\"},"
                        "\"organizerList\":[{\"name\":\"主办方\",\"format\":\"string\",\"describe\":\"赛事的主办单位名称,如:中国网球协会,北京体育局\",\"content\":\"\"}]}")


print(filed_dict)